import os
import string
import sys
import tkinter as tk
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import portrait
from tqdm import trange
from tkinter import filedialog


def file_name(file_dir, suffix=".jpg"):
    L = []
    # 通过文件、目录遍历器返回【文件夹路径, 文件夹列表, 文件列表】
    for root, dirs, files in os.walk(file_dir):
        for file in files:
            if os.path.splitext(file)[1] == suffix:# 分割文件路径为文件名和文件扩展名
                L.append(os.path.join(root, file))# 路径拼接
    # 对所有可迭代的对象通过文件名进行排序操作，返回一个新的列表
    L = sorted(L, key=lambda x: int(x.split('\\')[-1].split('/')[-1][:-4]))
    return L

def conpdf(f_pdf, filedir, suffix=".jpg"):
    # 得到排序后的图片组列表
    fileList = file_name(filedir, suffix)
    # 打开第一张图片
    (w, h) = Image.open(fileList[0]).size
    # 遍历图片，得到所有图片中最大的宽度和高度
    for i in range(len(fileList)):
        (wi, hi) = Image.open(fileList[i]).size
        if w>=wi:
            w=w
        else:
            w=wi
        if h>=hi:
            h=h
        else:
            h=hi
    # 生成PDF文档
    c = canvas.Canvas(f_pdf, pagesize=(w, h))
    # print('PDF文档的尺寸：',w,h)
    # 将内容绘制在PDF文档的页面中
    for i in trange(len(fileList)):        
        # 指定要绘制的图像
        f = fileList[i]
        # 要绘制的图像的宽度和高度
        (xsize, ysize) = Image.open(f).size
        # 在画布上放置图像的 x 坐标位置
        posx=(w - xsize) / 2
        # 在画布上放置图像的 y 坐标位置
        posy=(h - ysize) / 2
        # print(posx, posy, xsize, ysize)
        # 在PDF中添加图像
        # ⇒要绘制的图像，在画布上放置图像的 x 坐标位置，在画布上放置图像的 y 坐标位置，要使用的图像的宽度（伸展或缩小图像），要使用的图像的高度（伸展或缩小图像）
        c.drawImage(f, posx, posy, xsize, ysize)
        # 在当前页面之后添加一个新页面
        c.showPage()
    c.save()
    print("转码完毕")

# 直接执行脚本，语句之前和之后的代码都被执行，引用脚本，之前的语句被执行，之后的没有被执行
if __name__ == "__main__":
    while True:
        # 创建Tkinter的根窗口
        root = tk.Tk()
        # # 最小化
        # root.iconify()
        # 隐藏
        root.withdraw()
        # 弹出文件夹选择对话框
        folder_path = filedialog.askdirectory()
        if not folder_path:
            break
        file_path = filedialog.askopenfilename()
        # PNG转PDF
        print(f'正在转码 文件夹 {folder_path.split("/")[-1]} 中的 {file_path.split("/")[-1][-3:]} 文件')
        conpdf(fr'{folder_path}/{folder_path.split("/")[-1]}.pdf', fr'{folder_path}', fr'{file_path.split("/")[-1][-4:]}')